package co.edu.uniandes.ecos.comunicacion;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

import co.edu.uniandes.ecos.dal.MensajeDal;

public class SocketManager 
{
	private ArrayList<Usuario> Usuarios;
	
	public SocketManager()
	{
		Usuario usuario1 = new Usuario("ubaque","e10adc3949ba59abbe56e057f20f883e","01","0000");
		Usuario usuario2 = new Usuario("pedro","c893bad68927b457dbed39460e6afd62","02","0001");
		
		this.Usuarios= new ArrayList <Usuario>();
		this.Usuarios.add(usuario1);
		this.Usuarios.add(usuario2);
	}
	
	public Usuario obtenerUsuario(Usuario pUsuario)
	{
		boolean esta=false;
		int i=0;
		Usuario user=null;
		
		while (i<this.Usuarios.size() && (esta==false))
		{
			if ((this.Usuarios.get(i).getUserId().equals(pUsuario.getUserId())==true) &&
				(this.Usuarios.get(i).getPassword().equals(pUsuario.getPassword())==true) &&
				(this.Usuarios.get(i).getTipoOperacion().equals(pUsuario.getTipoOperacion())==true)&&
				(this.Usuarios.get(i).getCasaOficina().equals(pUsuario.getCasaOficina())==true))
			{
				esta=true;
				user=this.Usuarios.get(i);
			}
			i++;
		}
		
		return user;
	}
	
	public static void main(String[] args) 
	{
		
		if (args.length < 1) 
		{
			System.out.println("debe pasar el parametro:  puerto");
			System.exit(-1);
		}

		int puerto = Integer.parseInt(args[0]);
		ServerSocket serverSocket = null;
		try 
		{
			serverSocket = new ServerSocket(puerto);
			System.out.println("Escuchando en puerto: " + serverSocket.toString());

		} catch (IOException e) {
			System.err.println("No se puede escuchar en puerto: " + puerto
					+ ". " + e.getMessage());
			System.exit(-1);
		}
		
		while (true) 
		{
			try 
			{
				new HiloEvento(serverSocket.accept()).start();
			} 
			catch (IOException e) 
			{
				e.printStackTrace();
			}
		}
	}
}

class HiloEvento extends Thread 
{
	private Socket socketCliente;
	private MensajeDal mensajeDal = null;
	private String listaEventos = "";

	public HiloEvento(Socket cliente) 
	{
		this.socketCliente = cliente;
	}

	public void run() {
		try 
		{
			SocketManager sM= new SocketManager();
			socketCliente.setSoTimeout(10000);
			BufferedReader in = new BufferedReader(new InputStreamReader(socketCliente.getInputStream()));	
			String login = in.readLine(); // Login
			String passwordHash = in.readLine(); // Password en has MD5
			String tipoOperacion = in.readLine(); // Tipo de Operacion
			String casa = in.readLine(); // Consulta
			
			Usuario usuarioTemp = new Usuario(login,passwordHash,tipoOperacion,casa);
			if(sM.obtenerUsuario(usuarioTemp)!=null)
			{			
				System.out.println("Peticion: "+casa);
				mensajeDal = new MensajeDal();
				listaEventos = mensajeDal.mensajesXCasa(casa);			
				
				PrintWriter salida = new PrintWriter(socketCliente.getOutputStream(), true);
				salida.println(listaEventos);
				//System.out.println(listaEventos);
				in.close();	
				salida.close();
				this.socketCliente.close();
			}
			else
			{
				/*System.out.println("Usuario sin autrizacion");*/
				PrintWriter salida = new PrintWriter(socketCliente.getOutputStream(), true);
				salida.println("Usuario sin autrizacion");
				in.close();	
				salida.close();
				this.socketCliente.close();
			}
		}
		catch (Exception e2) 
		{
				e2.printStackTrace();
		}
	}	
}